package com.ygqh.baby.service;

import com.ygqh.baby.ao.*;
import com.ygqh.baby.model.*;
import com.ygqh.baby.po.YgCoupon;
import com.ygqh.baby.po.YgUser;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

public interface YgCouponService {

	List<YgCoupon> find(Long supplierId, PromotionStatus pStatus, Date startDate, Date endDate, String q);

	/**
	 * 
	 * @param queryInfo
	 * @param supplierId
	 * @param pStatus
	 *            促销活动状态（未开始，进行中，已结束）
	 * @param startDate
	 * @param endDate
	 * @param q
	 * @return
	 */
	ResultSet<YgCoupon> search(QueryInfo queryInfo, Long supplierId, PromotionStatus pStatus, Date startDate, Date endDate, String q);

	ResultSet<YgCoupon> search(QueryInfo queryInfo, Long supplierId, PromotionStatus pStatus, Date startDate, Date endDate, String q, CouponType couponType,
			Long[] batchIds);

	/**
	 * 获取当前客户拥有的且满足条件的未使用的优惠卷
	 * 
	 * @param userId
	 * @param productPrice
	 * @param cStatus
	 * @param useCoupon
	 *            是否可以使用优惠卷
	 * @param onlySpecial
	 *            此次订单只有特例商品（特例品只能使用无门槛优惠券）
	 * @return
	 */
	List<YgCouponModel> findCouponListForPay(Long userId, BigDecimal productPrice, CouponStatus cStatus, Boolean useCoupon, Boolean onlySpecial,
			String productIds, SalesPlatform salesPlatform);

	/**
	 * 获取当前客户拥有的 优惠卷
	 * 
	 * @param queryInfo
	 * @param userId
	 * @param cStatus
	 * @param sceneType
	 * @param salesPlatform
	 * @return
	 */
	List<YgCouponModel> findOwnCouponList(QueryInfo queryInfo, Long userId, CouponStatus cStatus, SceneType sceneType, SalesPlatform salesPlatform);

	int findCount(Long supplierId);

	YgCoupon findById(Long id);

	YgCoupon findByCouponCode(String couponCode, Long userId);

	int deleteSoft(Long[] ids);

	int deleteSoft(Long id);

	/**
	 * 添加优惠卷
	 * @return
	 */
	int addCoupon(EditCouponReq editCouponReq);

	/**
	 * 结算页获取优惠卷信息
	 * 
	 * @param userId
	 * @param couponDetailId
	 * @param productPrice
	 * @param onlySpecial
	 *            此次订单只有特例商品
	 * @return
	 */
	@Deprecated
	YgCouponModel findCouponForPay(Long userId, Long couponDetailId, BigDecimal productPrice, Boolean onlySpecial, List<Long> productIds,
			SalesPlatform salesPlatform);

	/**
	 * 校验优惠卷是否满足领取条件
	 * 
	 * @param couponCode
	 * @return
	 */
	Message validCoupon(String couponCode, Long userId);

	Message bindCoupon(String couponCode, YgUser user);

	Message receiveCoupon(Long couponBatchId, YgUser user);

	/**
	 * 批量领取
	 * 
	 * @param couponBatchIds
	 * @param user
	 * @return
	 */
	Message receiveCouponBatch(String couponBatchIds, YgUser user);

	/**
	 * 批量领取
	 * 
	 * @Title: receiveCouponBatchV2
	 * @param couponBatchIds
	 * @param endDate
	 * @param user
	 *            入参
	 * @return Message 返回类型
	 * @author （guohao）
	 * @throws @date
	 *             2017年10月20日 下午3:05:13
	 * @version V1.0
	 */
	Message receiveCouponBatchV2(String couponBatchIds, Date endDate, YgUser user);

	/**
	 * 商品优惠券下的商品
	 * 
	 * @param id
	 * @return
	 */
	@Deprecated
	ResultSet<YgProduct4ListModel> findProductListByCouponId(Long id);
	ResultSet<YgProduct4ListModel> findProductListByCouponId(Long id, SalesPlatform salesPlatform);

	/**
	 * 获取结算最优优惠券
	 * 
	 * @param userId
	 *            当前用户
	 * @param couponDetailId
	 *            指定优惠券
	 * @param productPrice
	 *            商品价格（比较值）
	 * @param onlySpecial
	 *            是否仅有特例品
	 * @param carList
	 *            结算购物车信息
	 * @param salesPlatform
	 *            销售平台
	 * @return
	 */
	YgCouponModel findCouponForPayV2(Long userId, Long couponDetailId, BigDecimal productPrice, Boolean onlySpecial, List<YgShoppingCarModel> carList,
			SalesPlatform salesPlatform);

	/**
	 * 获取优惠券列表（结算）
	 * 
	 * @param userId
	 *            当前用户
	 * @param productPrice
	 *            商品价（比较值）
	 * @param couponStatus
	 *            获取的结果（可用，不可用）
	 * @param useCoupon
	 *            是否可以使用优惠券
	 * @param onlySpecial
	 *            是否仅有特例品
	 * @param carList
	 *            结算购物车信息
	 * @param salesPlatform
	 *            销售平台
	 * @return
	 */
	List<YgCouponModel> findCouponListForPayV2(Long userId, Long couponDetailId, BigDecimal productPrice, CouponStatus couponStatus, Boolean useCoupon, Boolean onlySpecial,
			List<YgShoppingCarModel> carList, SalesPlatform salesPlatform);

	/**
	 * 校验优惠券的可用性
	 * 
	 * @param couponSceneType
	 *            优惠券使用场景
	 * @param couponProductIds
	 *            优惠券限定商品id（多个以英文逗号隔开）或限定品牌id
	 * @param couponProductIds
	 *            结算商品id（多个以英文逗号隔开）
	 * @return
	 */
	boolean validateUsable(SceneType couponSceneType, String couponProductIds, String paidProductIds);
	/**
	 * 获取仅在前台显示的优惠券
	 * @param showWeb
	 * @return
	 */
	List<YgCouponModel> findCouponList(Boolean showWeb,
			SalesPlatform salesPlatform, Long productId, Long brandId);

	YgCouponPageModel getCouponPage();

    YgCoupon findByDetailId(Long couponDetailId);
}
